package com.brain.segu.mbean;

import com.brain.core.common.UtilCore;
import com.brain.core.dto.EmpresaDto;
import com.brain.core.dto.EmpresaOpcionSistemaDto;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.BitacoraManager;
import com.brain.core.manager.EmpresaManager;
import com.brain.core.manager.EmpresaOpcionSistemaManager;
import com.brain.core.manager.RecursosManager;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.GenericMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.segu.dto.OpcionSistemaDto;
import com.brain.segu.manager.OpcionSistemaManager;

import java.io.Serializable;
import java.util.List;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.primefaces.model.TreeNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 * @author Greip Company
 * @since 28/01/2014
 * @version 1.0
 */
@Controller("opcionSistemaMBean")
@Scope("session")
public class OpcionSistemaMBean extends GenericMBean implements Serializable {

    /**
     * Guarda las acciones del sistema en un archivo de texto plano
     *
     * @since 28/01/2014
     */
    private static Logger logger = Logger.getLogger(OpcionSistemaMBean.class);
    /**
     * Objeto de la clase OpcionSistemaManager configuración
     *
     * @since 28/01/2014
     */
    @Resource
    private OpcionSistemaManager manager;
    /**
     * Objeto de la clase EmpresaManager configuración
     *
     * @since 28/01/2014
     */
    @Resource
    private EmpresaManager empresaManager;
    /**
     * Objeto de la clase BitacoraManager configuración
     *
     * @since 28/01/2014
     */
    @Resource
    private BitacoraManager bitacoraManager;
    /**
     * Objeto de la clase EmpresaOpcionSistemaManager configuración
     *
     * @since 28/01/2014
     */
    @Resource
    private EmpresaOpcionSistemaManager empresaOpcionSistemaManager;
    /**
     * Objeto de la clase RecursosManager (acceso a metodos utilitarios)
     *
     * @since 28/01/2014
     */
    @Resource
    private RecursosManager recursosManager;
    /**
     * Objeto tipo lista de la clase OpcionSistemaDto
     *
     * @since 28/01/2014
     */
    private List<OpcionSistemaDto> lista;
    /**
     * Objeto de la entidad actual
     *
     * @since 28/01/2014
     */
    private OpcionSistemaDto dto;
    /**
     * Objeto de la clase EmpresaOpcionSistemaDto
     *
     * @since 28/01/2014
     */
    private List<EmpresaOpcionSistemaDto> listaEmpresaOpcionSistema;
    /**
     * Titulo del formulario
     *
     * @since 28/01/2014
     */
    private String keyEntidad = "key.entidad.opciones.sistema";
    /**
     * Objeto de la clase TreeNode (Árbol de nodos)
     *
     * @since 28/01/2014
     */
    private TreeNode opcionesSistemas;
    /**
     * Objeto de la clase TreeNode (Árbol de nodos)
     *
     * @since 28/01/2014
     */
    private TreeNode selectedOpcionesSistema;
    /**
     * Objeto de la entidad actual
     *
     * @since 28/01/2014
     */
    private OpcionSistemaDto OpcionesSistemaPrincipal;
    /**
     * Objeto de la entidad actual
     *
     * @since 28/01/2014
     */
    private OpcionSistemaDto OpcionesSistemaSeleccionadoDto;
    /**
     * Objeto de la clase EmpresaOpcionSistemaDto
     *
     * @since 28/01/2014
     */
    private EmpresaOpcionSistemaDto empresaOpcionSistemaDto;
    /**
     * Objeto de la clase EmpresaDto
     *
     * @since 28/01/2014
     */
    private EmpresaDto empresaId;
    /**
     * Verifica si la carga se hace satisfactoriamente
     *
     * @since 28/01/2014
     */
    private Long verificarCargaOpcionesSistema;
    /**
     * Objeto booleano que indica el estado del boton de guardado
     *
     * @since 28/01/2014
     */
    private Boolean validarBotonGuardar = Boolean.FALSE;
    /**
     * objeto de la clase ApplicationMBean , acceso a la clase utilitaria de
     * configuración
     *
     * @since 28/01/2014
     */
    @Autowired
    private ApplicationMBean applicationMBean;
    /**
     * objeto de la clase SessionMBean
     *
     * @since 28/01/2014
     */
    @Autowired
    private SessionMBean sessionMBean;
    /**
     * Objeto tipo lista de la clase EmpresaDto
     *
     * @since 28/01/2014
     */
    private List<EmpresaDto> listaEmpresa;

    /**
     * Metodo constructor de la clase Actual
     *
     * @since 28/01/2014
     */
    public OpcionSistemaMBean() {
    }

    /**
     * Metodo que permite instanciar todos los objetos al iniciar el formulario
     *
     * @since 28/01/2014
     */
    public String iniciar() {
        try {
            this.lista = null;
            this.dto = null;
            this.opcionesSistemas = this.cargarOpcionesSistema(this.manager.obtenerPorId(this.manager.getIdOpcionSistemaPrincipal()));
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
        }

        return manager.getUrlLista();
    }

    /**
     * Metodo que permite Iniciar las opciones del sistema dependiendo de la
     * empresa seleccionada
     *
     * @since 28/01/2014
     * @param empresaDto objeto de la clase EmpresaDto que contiene los valores
     * de filtro
     * @return retorna la url de la pagina principal
     */
    public String iniciarOpcionSistemaDesdeEmpresa(EmpresaDto empresaDto) {
        try {
            this.lista = null;
            this.dto = null;
            this.listaEmpresaOpcionSistema = this.empresaOpcionSistemaManager.obtenerTodosPorEmpresa(empresaDto);
            this.opcionesSistemas = this.manager.cargarProcesoInicialDesdeEmpresa(this.listaEmpresaOpcionSistema);
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
        }

        return manager.getUrlLista();
    }

    /**
     * Metodo que permite filtrar las opciones del sistema por el ubigeo de la
     * empresa
     *
     * @since 28/01/2014
     * @param ubigeoInicalId identificador del ubigeo inicial
     *
     */
    public void filtroEmpresa(Long ubigeoInicalId) {
        try {
            this.OpcionesSistemaPrincipal = this.manager.obtenerPorId(ubigeoInicalId);
            this.opcionesSistemas = cargarOpcionesSistema(this.OpcionesSistemaPrincipal);

        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
        }
    }

    /**
     * Metodo que permite filtrar las opciones del sistema
     *
     * @since 28/01/2014
     */
    public void filtroEmpresa() {
        try {
            this.OpcionesSistemaPrincipal = this.manager.OpcionSistemaPrincipalPorEmpresa(this.empresaId).get(0);
            this.opcionesSistemas = cargarOpcionesSistema(this.OpcionesSistemaPrincipal);
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
        }
    }

    /**
     *
     * @param empresaDto
     * @since 28/01/2014
     */
    public String cargaOpcionsistemaDesdeEmpresa(EmpresaDto empresaDto) {

        return manager.getUrlLista();

    }

    /**
     * Metodo que permite crear un TreeNode con los datos de las opciones del
     * sistema de la empresa
     *
     * @since 28/01/2014
     * @param empresaDto
     * @return retorna una TreeNode con los datos de todas las opciones del
     * sistema
     */
    private TreeNode cargarOpcionesSistema(OpcionSistemaDto ubigeoPrincipal) {
        return this.manager.opcionesSistemaCarga(ubigeoPrincipal);
    }

    /**
     * Metodo que permite cargar los valores de un dto existente y construye el
     * formulario para editar un registro
     *
     * @since 28/01/2014
     * @return retorna la url de la pagina de editado
     */
    public void editarOpcionSistema() {
        this.dto = new OpcionSistemaDto();
        this.OpcionesSistemaSeleccionadoDto = (OpcionSistemaDto) selectedOpcionesSistema.getData();
        this.dto = this.OpcionesSistemaSeleccionadoDto;
        this.validarBotonGuardar = Boolean.FALSE;
        sessionMBean.setAccion(applicationMBean.getEditar());
    }

    /**
     * Metodo que setea los valores del dto y construye el formulario para crear
     * un nuevo registro
     *
     * @since 28/01/2014
     * @return retorna la url de la nueva pagina
     */
    public void nuevaOpcionSistema() {
        this.OpcionesSistemaSeleccionadoDto = (OpcionSistemaDto) selectedOpcionesSistema.getData();
        this.validarBotonGuardar = this.manager.validarCreacionTipo(this.OpcionesSistemaSeleccionadoDto.getTipoMenu());

        this.dto = new OpcionSistemaDto();
        this.dto.setActivo(Boolean.TRUE);
        this.dto.setUsuario(sessionMBean.getSessionUsuarioDto().getId());
        this.dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
        this.dto.setPadreDto(this.OpcionesSistemaSeleccionadoDto);
        //this.dto.setEmpresa(this.empresaId.getId());
        this.dto.setTipoMenu(this.manager.evaluarTipo(this.OpcionesSistemaSeleccionadoDto));

        sessionMBean.setAccion(applicationMBean.getNuevo());
    }

    /**
     * Metodo que permite registra y editar los valores de la entidad actual
     *
     * @since 28/01/2014
     */
    public void guardar() {
        //this.dto.setEmpresa(this.empresaId.getId());
        manager.guardar(this.dto);
        this.iniciar();
    }

    /**
     * Metodo que permite ver el historial de las acciones de un usuario sobre
     * el registro seleccionado
     *
     * @since 28/01/2014
     * @return retorna un valor nulo
     */
    public String verBitacora() {
        OpcionSistemaDto ubgDtoAux = new OpcionSistemaDto();
        ubgDtoAux = (OpcionSistemaDto) selectedOpcionesSistema.getData();
        bitacoraManager.cargarBitacoraEntidad(manager.getIdEntidad(), ubgDtoAux.getId());
        return null;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        OpcionSistemaMBean.logger = logger;
    }

    public OpcionSistemaManager getManager() {
        return manager;
    }

    public void setManager(OpcionSistemaManager manager) {
        this.manager = manager;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public List<OpcionSistemaDto> getLista() {
        return lista;
    }

    public void setLista(List<OpcionSistemaDto> lista) {
        this.lista = lista;
    }

    public OpcionSistemaDto getDto() {
        return dto;
    }

    public void setDto(OpcionSistemaDto dto) {
        this.dto = dto;
    }

    public String getKeyEntidad() {
        return keyEntidad;
    }

    public void setKeyEntidad(String keyEntidad) {
        this.keyEntidad = keyEntidad;
    }

    public TreeNode getOpcionesSistemas() {
        return opcionesSistemas;
    }

    public void setOpcionesSistemas(TreeNode opcionesSistemas) {
        this.opcionesSistemas = opcionesSistemas;
    }

    public TreeNode getSelectedOpcionesSistema() {
        return selectedOpcionesSistema;
    }

    public void setSelectedOpcionesSistema(TreeNode selectedOpcionesSistema) {
        this.selectedOpcionesSistema = selectedOpcionesSistema;
    }

    public OpcionSistemaDto getOpcionesSistemaPrincipal() {
        return OpcionesSistemaPrincipal;
    }

    public void setOpcionesSistemaPrincipal(OpcionSistemaDto OpcionesSistemaPrincipal) {
        this.OpcionesSistemaPrincipal = OpcionesSistemaPrincipal;
    }

    public OpcionSistemaDto getOpcionesSistemaSeleccionadoDto() {
        return OpcionesSistemaSeleccionadoDto;
    }

    public void setOpcionesSistemaSeleccionadoDto(OpcionSistemaDto OpcionesSistemaSeleccionadoDto) {
        this.OpcionesSistemaSeleccionadoDto = OpcionesSistemaSeleccionadoDto;
    }

    public EmpresaDto getEmpresaId() {
        return empresaId;
    }

    public void setEmpresaId(EmpresaDto empresaId) {
        this.empresaId = empresaId;
    }

    public Long getVerificarCargaOpcionesSistema() {
        return verificarCargaOpcionesSistema;
    }

    public void setVerificarCargaOpcionesSistema(Long verificarCargaOpcionesSistema) {
        this.verificarCargaOpcionesSistema = verificarCargaOpcionesSistema;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public List<EmpresaDto> getListaEmpresa() {
        return this.recursosManager.obtenerEmpresasActivasCombo();
    }

    public void setListaEmpresa(List<EmpresaDto> listaEmpresa) {
        this.listaEmpresa = listaEmpresa;
    }

    public Boolean getValidarBotonGuardar() {
        return validarBotonGuardar;
    }

    public void setValidarBotonGuardar(Boolean validarBotonGuardar) {
        this.validarBotonGuardar = validarBotonGuardar;
    }

    public EmpresaOpcionSistemaDto getEmpresaOpcionSistemaDto() {
        return empresaOpcionSistemaDto;
    }

    public void setEmpresaOpcionSistemaDto(EmpresaOpcionSistemaDto empresaOpcionSistemaDto) {
        this.empresaOpcionSistemaDto = empresaOpcionSistemaDto;
    }

    public List<EmpresaOpcionSistemaDto> getListaEmpresaOpcionSistema() {
        return listaEmpresaOpcionSistema;
    }

    public void setListaEmpresaOpcionSistema(List<EmpresaOpcionSistemaDto> listaEmpresaOpcionSistema) {
        this.listaEmpresaOpcionSistema = listaEmpresaOpcionSistema;
    }

}
